home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ARexxTools / REXX_ArgParse.lha / REXX-ArgParse / ArgParse.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1995-12-15  |  5.2 KB  |  223 lines

  1. /******************************************************************************
  2. **
  3. ** $VER: ArgParse.rexx 1.06 by PATZ (31.10.95)
  4. **
  5. ** takes template & cmdline, returns line which caller has to INTERPRET
  6. **
  7. ** 1.00       : initial release
  8. ** 1.00->1.01 : added internal "PATZ/S" which lists all arguments
  9. ** 1.01->1.02 : added colored output to "PATZ/S"
  10. ** 1.02->1.03 : changed "PATZ/S" to "DEBUG_ARGPARSE/S"
  11. ** 1.03->1.04 : fixed severe bug in "/K": was using "k" as index
  12. ** 1.04->1.05 : added internal "QUIET_ARGPARSE/S" which disables erroroutput
  13. **              added support for "/N" (whole!), currently needs keyword!
  14. ** 1.05->1.06 : added underscore as first char to all variables - should give
  15. **              less collisions
  16. **
  17. ** Supported  : /A,/K (NO combinations! eg /A/K), /S (-> 0/1), /N
  18. **
  19. ** Known Bugs: - cmdline cannot have "'" in it
  20. **             - template should not contain _#?/? words (not really a bug)
  21. **
  22. ******************************************************************************/
  23.  
  24. PARSE ARG template,cmdline
  25.  
  26. OPTIONS FAILAT 21
  27.  
  28. /* template sample : "ACTION/A,DRIVE/A,FILE/A,TRACKS/K,VERBOSE/S,FORCE/S" */
  29.  
  30. _err=0
  31. _errtext=""
  32. _argparse=""
  33. _internal_list=0
  34. _internal_quiet=0
  35. _ESC= '1b'x /* escape code */
  36.  
  37. IF cmdline == "?" THEN DO
  38.     ADDRESS command 'Echo "' || template || ': " NOLINE'
  39.     PARSE PULL cmdline
  40. END
  41.  
  42. /* checking quotes */
  43. _quotes=0
  44. _i=1
  45. DO FOREVER
  46.     _i=POS('"',cmdline,_i)+1
  47.     IF _i ~== 1 THEN
  48.         _quotes=_quotes+1
  49.     ELSE
  50.         LEAVE
  51. END
  52. IF _quotes//2 == 1 THEN DO
  53.     _errtext="PARSING ERROR: no matching quote"; _err=20
  54.     SIGNAL CLEANUP
  55. END
  56.  
  57. /* command line -> _argv & _argc */
  58. _argc=0
  59. _last=LENGTH(cmdline)
  60. _cl=cmdline || " "
  61.  
  62. DO _i=1 TO _last
  63.     _ch=SUBSTR(_cl,_i,1)
  64.     IF _ch ~== " " THEN DO
  65.         _argc=_argc+1
  66.         _start=_i
  67.         IF _ch == '"' THEN DO
  68.             _i=POS('"',_cl,_start+1)+1
  69.             _argv._argc=SUBSTR(_cl,_start,_i-_start)
  70.         END
  71.         ELSE DO
  72.             _i=POS(" ",_cl,_start)
  73.             _argv._argc='"' || SUBSTR(_cl,_start,_i-_start) || '"'
  74.         END
  75.     END
  76. END
  77.  
  78. /* template -> A & K & S & N (& R) */
  79. _templateSPACE=TRANSLATE(template," ",",")
  80. _A=""; _K=""; _S=""; _N=""; _R=""
  81. DO _i=1 TO WORDS(_templateSPACE)
  82.     _tp=WORD(_templateSPACE,_i); _len=LENGTH(_tp)-2; _type=RIGHT(_tp,2)
  83.     SELECT
  84.         WHEN _type == "/A" THEN
  85.             _A=_A || " " || LEFT(_tp,_len)
  86.         WHEN _type == "/K" THEN
  87.             _K=_K || " " || LEFT(_tp,_len)
  88.         WHEN _type == "/S" THEN
  89.             _S=_S || " " || LEFT(_tp,_len)
  90.         WHEN _type == "/N" THEN
  91.             _N=_N || " " || LEFT(_tp,_len)
  92.         OTHERWISE
  93.             _R=_R || " " || _tp
  94.     END
  95. END
  96. _A=STRIP(_A,'L'," "); _K=STRIP(_K,'L'," "); _S=STRIP(_S,'L'," "); _N=STRIP(_N,'L'," ")
  97. _R=STRIP(_R,'L'," ")
  98.  
  99. /* /S */
  100. DO _i=1 TO WORDS(_S)+1 /* +1 is needed for internal /S */
  101.     _var=UPPER(WORD(_S,_i))
  102.     _line=_var || "=0" /* default value */
  103.     DO _j=1 TO _argc
  104.         IF UPPER(_argv._j) == '"DEBUG_ARGPARSE"' THEN DO /* internal */
  105.             _internal_list=1
  106.             _argv._j=""
  107.             ITERATE
  108.         END
  109.         IF UPPER(_argv._j) == '"QUIET_ARGPARSE"' THEN DO /* internal */
  110.             _internal_quiet=1
  111.             _argv._j=""
  112.             ITERATE
  113.         END
  114.         IF UPPER(_argv._j) == '"' || _var || '"' THEN DO
  115.             _line=_var || "=1"
  116.             _argv._j=""
  117.         END
  118.     END
  119.     IF _line ~== "=0" THEN /* not internal */
  120.         _argparse = _argparse || "; " || _line
  121. END
  122.  
  123. /* /N, currently needs keyword! */
  124. DO _i=1 TO WORDS(_N)
  125.     _var=UPPER(WORD(_N,_i))
  126.     _line=_var || "='""""'"
  127.     DO _j=1 TO _argc
  128.         IF UPPER(_argv._j) == '"' || _var || '"' THEN DO
  129.             _h=_j+1
  130.             IF DATATYPE(STRIP(_argv._h,'B','"'),'W') ~== 1 THEN DO
  131.                 _errtext="ERROR: bad number"; _err=20
  132.                 SIGNAL CLEANUP
  133.             END
  134.             _line=_var || "=" || STRIP(_argv._h,'B','"')
  135.             _argv._j=""
  136.             _argv._h=""
  137.         END
  138.     END
  139.     _argparse = _argparse || "; " || _line
  140. END
  141.  
  142. /* /K */
  143. DO _i=1 TO WORDS(_K)
  144.     _var=UPPER(WORD(_K,_i))
  145.     _line=_var || "='""""'"
  146.     DO _j=1 TO _argc
  147.         IF UPPER(_argv._j) == '"' || _var || '"' THEN DO
  148.             _h=_j+1
  149.             _line=_var || "='" || _argv._h || "'"
  150.             _argv._j=""
  151.             _argv._h=""
  152.         END
  153.     END
  154.     _argparse = _argparse || "; " || _line
  155. END
  156.  
  157. /* /A */
  158. DO _i=1 TO WORDS(_A)
  159.     _var=TRANSLATE(UPPER(WORD(_A,_i)))
  160.     _line=_var || "='""""'"
  161.     DO _j=1 TO _argc
  162.         IF UPPER(_argv._j) == '"' || _var || '"' THEN DO
  163.             _k=_j+1
  164.             _line=_var || "='" || _argv._k || "'"
  165.             _argv._j=""
  166.             _argv._k=""
  167.         END
  168.     END
  169.     INTERPRET _line /* MUST remain here! */
  170.     IF RIGHT(_line,4) ~== "'""""'" THEN
  171.         _argparse = _argparse || "; " || _line
  172. END
  173.  
  174. /* fill empty /A's */
  175. _start=1
  176. DO _i=1 TO WORDS(_A)
  177.     _var=WORD(_A,_i)
  178.     _line="_value=" || _var
  179.     INTERPRET _line /* MUST remain here! */
  180.     IF _value ~== '""' THEN
  181.         ITERATE
  182.     DO WHILE (_argv._start="") & (_start<=_argc)
  183.         _start=_start+1
  184.     END
  185.     IF _start>_argc THEN DO
  186.         _errtext="required argument missing"; _err=20
  187.         SIGNAL CLEANUP
  188.     END
  189.     _line=_var || "='" || _argv._start || "'"
  190.     _argv._start=""
  191.     _argparse = _argparse || "; " || _line
  192. END
  193.  
  194. DO _i=1 TO _argc
  195.  IF _argv._i ~== "" THEN DO
  196.      _errtext="wrong number of arguments"; _err=20
  197.  END
  198. END
  199.  
  200. CLEANUP:
  201. /* internal */
  202. IF _internal_list == 1 THEN DO
  203.     SAY "Internal 'ArgParse' output:"
  204.     _internal_ap=STRIP(_argparse,'L',"; ")
  205.     INTERPRET _internal_ap
  206.     DO _i=1 TO WORDS(_templateSPACE)
  207.         _line=WORD(_templateSPACE,_i)
  208.         _line2=LEFT(_line,LENGTH(_line)-2)
  209.         _line3='SAY " ' || LEFT(_line2,10," ") || '=' || _ESC || '[32m"' || _line2 || '"' || _ESC || '[0m"'
  210.         INTERPRET _line3
  211.     END
  212.     SAY ""
  213. END
  214.  
  215. IF _err ~== 0 THEN DO
  216.     IF _internal_quiet ~== 1 THEN
  217.         SAY _errtext
  218.     EXIT _err
  219. END
  220.  
  221. RETURN STRIP(_argparse,'L',"; ")
  222.  
  223.